/*
    通过此函数，可以统一的为各个对象绑定一个计时器
    该函数会返回一个计时器对象，该对象会提供两个方法 1. start 创建计时器  2. stop 停止计时器
    该函数接收三个参数
    （1） duration：setInterval 方法的第二个参数   
    （2） thisObj 要绑定在哪一个对象上面  
    （3） callback：要做什么事儿，setInterval 方法的第一个参数
*/
export function getTimer(duration, thisObj, callback) {
  let timer = null; // 存储 setInterval 的返回值，用于停止计时器
  return {
    start: function () {
      // 如果计时器不存在时才会进行计时器的生成
      if (!timer) {
        timer = setInterval(callback.bind(thisObj), duration);
      }
    },
    stop: function () {
      if (timer) {
        clearInterval(timer); // 停止计时器
        timer = null;
      }
    },
  };
}

/**
 * 返回能够创建单例的构造函数
 * @param {*} fn 接收一个构造函数
 * @returns
 */
export function getSingle(fn) {
  var instance = null;
  return function () {
    if (instance !== null) {
      return instance;
    }
    instance = new fn(...arguments);
    return instance;
  };
}

/**
 * 返回指定范围的随机数
 * @param {*} min 最小值范围
 * @param {*} max 最大值范围
 */
export function getRandom(min, max) {
  return Math.floor(Math.random() * (max - min + 1) + min);
}

// 游戏容器宽
export var width = 800;
// 游戏容器高
export var height = 600;
// 大地的高度
export var landHeight = 112;

// 小鸟活动区域
export var birdAreaHeight = height - landHeight;
